#ifndef VECTOR_H
#define VECTOR_H

#define VECTOR_INIT_CAPACITY 4

#define VECTOR_INIT(vec) vector vec; vector_init(&vec)
#define VECTOR_ADD(vec, item) vector_add(&vec, (void *) item)
#define VECTOR_SET(vec, id, item) vector_set(&vec, id, (void *) item)
#define VECTOR_GET(vec, type, id) (type) vector_get(&vec, id)
#define VECTOR_DELETE(vec, id) vector_delete(&vec, id)
#define VECTOR_TOTAL(vec) vector_total(&vec)
#define VECTOR_FREE(vec) vector_free(&vec)

typedef struct vector
{
    void** items;
    int capacity;
    int total;
} vector;

void vector_init (vector*);
int vector_total (vector*);
static void vector_resize (vector*, int);
void vector_add (vector*, void*);
void vector_set (vector*, int, void*);
void* vector_get (vector*, int);
void vector_delete (vector*, int);
void vector_free (vector*);

#endif